package com.weimei.conversionTreasure.utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.SpannableString;
import android.util.Log;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.utils.ColorTemplate;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.UUID;

public class ChartUtils {

    public static final String YHXY_URL = "http://privacy.csweimei.cn/user/yhxy.html?appname=";



    public static void setPieData(PieChart mPieChart,
                                  String type,String num,ArrayList<PieEntry> entries) {
        mPieChart.setUsePercentValues(false); //设置是否使用百分值,默认不显示
        mPieChart.getDescription().setEnabled(false);
        mPieChart.setDragDecelerationFrictionCoef(0.95f);


        //模拟数据
//        ArrayList<PieEntry> entries = new ArrayList<>();
//        for (TotalBean.DataDataBean.SpendListDataBean payEntity : list) {
//            entries.add(new PieEntry(Float.parseFloat(payEntity.price), payEntity.title + "-" + payEntity.price));
//        }

        //是否设置中心文字
        mPieChart.setDrawCenterText(true);
        //绘制中间文字
        SpannableString sp = null;
//        if (list.size() > 0) {
//            if (type.equals(CommonUtils.ZHI_CHU)) {
//                sp = new SpannableString("总支出\n" + num);
//            } else {
//                sp = new SpannableString("总收入\n" + num);
//            }
//        }

        mPieChart.setCenterText(sp);
        mPieChart.setExtraOffsets(20.f, 0.f, 20.f, 0.f);

        //设置是否为实心图，以及空心时 中间的颜色
        mPieChart.setDrawHoleEnabled(true);
        mPieChart.setHoleColor(Color.WHITE);

        //设置圆环信息
        mPieChart.setTransparentCircleColor(Color.WHITE);//设置透明环颜色
        mPieChart.setTransparentCircleAlpha(110);//设置透明环的透明度
        mPieChart.setHoleRadius(60f);//设置内圆的大小
        mPieChart.setTransparentCircleRadius(60f);//设置透明环的大小

        mPieChart.setRotationAngle(0);
        // 触摸旋转
        mPieChart.setRotationEnabled(false);
        //选中变大
        mPieChart.setHighlightPerTapEnabled(true);


        //设置数据
        setData(entries, mPieChart);


        //设置图例
        Legend l = mPieChart.getLegend();
        l.setEnabled(false);//是否启用图列（true：下面属性才有意义）
        //设置显示的位置，低版本用的是setPosition();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        //设置是否显示图例
        l.setDrawInside(false);
        //设置图列换行(注意使用影响性能,仅适用legend位于图表下面)
        l.setWordWrapEnabled(true);
        //设置图例实体之间延X轴的间距（setOrientation = HORIZONTAL有效）
//        l.setXEntrySpace(10f);
        //设置图例实体之间延Y轴的间距（setOrientation = VERTICAL 有效）
        l.setYEntrySpace(5f);
        //设置每个图例实体中标签和形状之间的间距
        l.setFormToTextSpace(10f);
        //设置图例的形状
//        l.setForm(Legend.LegendForm.DEFAULT);
        //设置图例的大小
        l.setFormSize(10);

        //设置pieChart是否只显示饼图上百分比不显示文字（true：下面属性才有效果）
        mPieChart.setDrawEntryLabels(false);
        // 输入图例标签样式
        mPieChart.setEntryLabelColor(Color.BLACK);
        //设置描述的字体大小
        mPieChart.setEntryLabelTextSize(10f);

        mPieChart.animateY(3000); //在Y轴的动画  参数是动画执行时间 毫秒为单位
    }

    //设置数据
    private static void setData(ArrayList<PieEntry> entries, PieChart mPieChart) {
        PieDataSet dataSet = new PieDataSet(entries, "");
        //设置个饼状图之间的距离
        dataSet.setSliceSpace(0f);
        //颜色的集合，按照存放的顺序显示
        ArrayList<Integer> colors = new ArrayList<Integer>();
        for (int c : ColorTemplate.VORDIPLOM_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.JOYFUL_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.COLORFUL_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.LIBERTY_COLORS)
            colors.add(c);
        for (int c : ColorTemplate.PASTEL_COLORS)
            colors.add(c);
        colors.add(ColorTemplate.getHoloBlue());
        dataSet.setColors(colors);

        PieData data = new PieData(dataSet);
//        //百分比设置
//        data.setValueFormatter(new PiePercentFormatter());
//        //文字的颜色
//        data.setValueTextSize(10f);
//        data.setValueTextColor(Color.BLACK);
        mPieChart.setData(data);
        // 撤销所有的亮点
        mPieChart.highlightValues(null);
        mPieChart.invalidate();
    }

    public static void setLineChart(LineChart line
    ) {
        LineChartManager lineChartManager = new LineChartManager(line);
        //设置X轴的数据()
        List<String> xValues = new ArrayList<>();
        //设置y轴的数据()
        List<List<Float>> yValues = new ArrayList<>();
        List<Float> yValueSR = new ArrayList<>();
        List<Float> yValueZC = new ArrayList<>();
        List<Float> yValueJY = new ArrayList<>();




//        for (TotalBean.DataDataBean.DataListDataBean bean: s) {
//            xValues.add(bean.date);
//            yValueSR.add(Float.valueOf(bean.incomePrice));
//            yValueZC.add(Float.valueOf(bean.spendPrice));
//            yValueJY.add(Float.valueOf(bean.surplusPrice));
//        }

        Float maxZC = Collections.max(yValueZC);
        Float maxSR = Collections.max(yValueSR);
        yValues.add(yValueSR);
        yValues.add(yValueZC);
        yValues.add(yValueJY);

        //颜色集合
        List<Integer> colours = new ArrayList<>();
        colours.add(Color.parseColor("#FA8A30"));
        colours.add(Color.parseColor("#05A377"));
        colours.add(Color.parseColor("#00AADF"));

        //线的名字集合
        List<String> names = new ArrayList<>();
        names.add("收入");
        names.add("支出");
        names.add("结余");


        lineChartManager.showLineChart(xValues,yValues, names, colours);
        lineChartManager.setYAxis((maxZC > maxSR)? maxZC+100:maxSR+100, 0, 11);
        lineChartManager.setDescription("");
    }


    public static String getLastDayOfMonth(String yearMonth) {
        int year = Integer.parseInt(yearMonth.split("-")[0]);  //年
        int month = Integer.parseInt(yearMonth.split("-")[1]); //月
        Calendar cal = Calendar.getInstance();
        // 设置年份
        cal.set(Calendar.YEAR, year);
        // 设置月份
        // cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.MONTH, month); //设置当前月的上一个月
        // 获取某月最大天数
        //int lastDay = cal.getActualMaximum(Calendar.DATE);
        int lastDay = cal.getMinimum(Calendar.DATE); //获取月份中的最小值，即第一天
        // 设置日历中月份的最大天数
        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //上月的第一天减去1就是当月的最后一天
        // 格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(cal.getTime());
    }


    /**
     * 获得设备硬件标识，请务必获取权限：READ_PHONE_STATE
     * @param context 上下文
     * @return 设备硬件标识
     */
    public static String getDeviceId(Context context) {
        StringBuilder sbDeviceId = new StringBuilder();

        //获得设备默认IMEI（>=6.0 需要ReadPhoneState权限）
        String imei = null;
        try {
            imei = getIMEI(context);
        }catch (Exception e){
            e.printStackTrace();
        }
        //获得AndroidId（无需权限）
        String androidid = getAndroidId(context);
        //获得设备序列号（无需权限）
        String serial = getSERIAL();
        //获得硬件uuid（根据硬件相关属性，生成uuid）（无需权限）
        String uuid = getDeviceUUID().replace("-", "");

        //追加imei
        if (imei != null && imei.length() > 0) {
            sbDeviceId.append(imei);
            sbDeviceId.append("|");
        }
        //追加androidid
        if (androidid != null && androidid.length() > 0) {
            sbDeviceId.append(androidid);
            sbDeviceId.append("|");
        }
        //追加serial
        if (serial != null && serial.length() > 0) {
            sbDeviceId.append(serial);
            sbDeviceId.append("|");
        }
        //追加硬件uuid
        if (uuid.length() > 0) {
            sbDeviceId.append(uuid);
        }

        //生成SHA1，统一DeviceId长度
        if (sbDeviceId.length() > 0) {
            try {
                byte[] hash = getHashByString(sbDeviceId.toString());
                String sha1 = bytesToHex(hash);
                if (sha1.length() > 0) {
                    //返回最终的DeviceId
                    return sha1;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        //如果以上硬件标识数据均无法获得，
        //则DeviceId默认使用系统随机数，这样保证DeviceId不为空
        return UUID.randomUUID().toString().replace("-", "");
    }


    /**
     * 需要获得READ_PHONE_STATE权限，>=6.0，默认返回null
     * @param context
     * @return
     */
    @SuppressLint({"MissingPermission", "HardwareIds"})
    private static String getIMEI(Context context) {
        try {
            TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            return tm.getDeviceId();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

    /**
     * 获得设备的AndroidId
     *
     * @param context 上下文
     * @return 设备的AndroidId
     */
    @SuppressLint("HardwareIds")
    private static String getAndroidId(Context context) {
        try {
            return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

    /**
     * 获得设备序列号（如：WTK7N16923005607）, 个别设备无法获取
     *
     * @return 设备序列号
     */
    @SuppressLint("HardwareIds")
    private static String getSERIAL() {
        try {
            return Build.SERIAL;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

    /**
     * 获得设备硬件uuid
     * 使用硬件信息，计算出一个随机数
     * @return 设备硬件uuid
     */
    @SuppressLint("HardwareIds")
    private static String getDeviceUUID() {
        try {
            String dev = "3883756" +
                    Build.BOARD.length() % 10 +
                    Build.BRAND.length() % 10 +
                    Build.DEVICE.length() % 10 +
                    Build.HARDWARE.length() % 10 +
                    Build.ID.length() % 10 +
                    Build.MODEL.length() % 10 +
                    Build.PRODUCT.length() % 10 +
                    Build.SERIAL.length() % 10;
            return new UUID(dev.hashCode(), Build.SERIAL.hashCode()).toString();
        } catch (Exception ex) {
            ex.printStackTrace();
            return "";
        }
    }

    /**
     * 取SHA1
     * @param data 数据
     * @return 对应的hash值
     */
    private static byte[] getHashByString(String data) {
        try{
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.reset();
            messageDigest.update(data.getBytes(StandardCharsets.UTF_8));
            return messageDigest.digest();
        } catch (Exception e){
            return "".getBytes();
        }
    }

    /**
     * 转16进制字符串
     * @param data 数据
     * @return 16进制字符串
     */
    private static String bytesToHex(byte[] data){
        StringBuilder sb = new StringBuilder();
        String stmp;
        for (byte datum : data) {
            stmp = (Integer.toHexString(datum & 0xFF));
            if (stmp.length() == 1){
                sb.append("0");
            }
            sb.append(stmp);
        }
        return sb.toString().toUpperCase(Locale.CHINA);
    }






}
